package cn.ly.proxy.dynamicProxy;

import cn.ly.proxy.IPerson;

/**
 * 动态代理使用Demo
 */
public class Main {

    public static void main(String[] args) {
        //1.创建真实对象：stu
        IPerson stu = new Student();
        //2.创建一个代理类：  与代理对象相关联的InvocationHandler，并将stu真实对象 传给Handler
        StuInvocationHandler<IPerson> stuHandler = new StuInvocationHandler<>(stu); //stu不能为null
        //3.获取stu的代理对象：  使用Proxy的静态方法来【创建】一个stu的代理对象，代理对象的每个执行方法都会替换执行Invocation中的invoke方法
//        IPerson stuProxy = (IPerson) Proxy.newProxyInstance(IPerson.class.getClassLoader(),new Class<?>[]{IPerson.class},stuHandler);
        IPerson stuProxy = (IPerson) stuHandler.getProxyInstance();

        //4.代理对象交学费，执行的是增强后的方法
        stuProxy.giveMoney();

        //... 无论代理类中有多少个方法，都会统一先进入stuHandler的invoke方法中，可以对所有函数进行统一处理（AOP？）
    }
}
